
/**
 * @author wf.shu
 * @created 2017年7月26日 上午10:35:53
 */

package cn.daomeng.firebird.core.id;

import cn.daomeng.firebird.core.exception.FirebirdException;
import cn.daomeng.firebird.core.log.LogFactory;
import cn.daomeng.firebird.core.utils.WebToolUtils;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


/**
 * 这是一个获取Id值的Factory
 * 该服务需要两个参数，分别是区域编号（regionId）与工作服务编号（dataCenterId），数值将从IP V4的第三，第四位数据作为datacenterId与WorkerId
 *
 * @author wf.shu
 * @since 2018年2月26日 下午2:11:38
 */
public class IdFactory {
    Logger LOGGER = LoggerFactory.getLogger(IdFactory.class);
    /**
     * 数据中心ID， 数据范围[0,31]
     */
    private static long dataCenterId = 0;
    /**
     * 工作服务编号，数据范围[0,255]
     */
    private static long workerId = 0;

    static {
        try {
            String localIp = WebToolUtils.getLocalIP();
            if (StringUtils.isNotEmpty(localIp)) {
                String[] ip = WebToolUtils.getLocalIP().split("\\.");
                dataCenterId = Integer.valueOf(ip[2]) % 32;
                workerId = Integer.valueOf(ip[3]) % 256;
            }
        } catch (Exception e) {
            LogFactory.error("IdGenerator: IP解析失败", new FirebirdException("IP解析失败",e));
        }
    }

    /**
     * @return
     * @author wf.shu
     * @since 2017年10月13日 下午5:29:03
     */
    public static long generateId() {
        return IdGenerator.getInstance(workerId, dataCenterId).generate();
    }

    public static void main(String[] args) {
        for(int i=0;i<100;i++) {
            System.out.println("id = [" + IdFactory.generateId() + "]");
        }
    }
}
